package org.dromara.system.service;

import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysFaultInfoBo;
import org.dromara.system.domain.bo.SysFaultInfoQueryBo;
import org.dromara.system.domain.bo.SysFaultManageBo;
import org.dromara.system.domain.vo.SysFaultInfoVo;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.web.multipart.MultipartFile;

/**
 * 故障信息Service接口
 * 提供故障信息和解决方案的一体化管理功能
 *
 * @author system
 */
public interface ISysFaultInfoService {

    // ==================== 查询接口 ====================

    /**
     * 查询故障信息列表（分页）
     *
     * @param queryBo   查询参数
     * @param pageQuery 分页参数
     * @return 故障信息分页列表
     */
    TableDataInfo<SysFaultInfoVo> queryPageList(SysFaultInfoQueryBo queryBo, PageQuery pageQuery);

    /**
     * 查询故障信息列表（不分页）
     *
     * @param queryBo 查询参数
     * @return 故障信息列表
     */
    List<SysFaultInfoVo> queryList(SysFaultInfoQueryBo queryBo);

    /**
     * 查询故障信息详情（包含完整的解决方案信息）
     *
     * @param faultId 故障ID
     * @return 故障信息详情
     */
    SysFaultInfoVo queryById(Long faultId);

    // ==================== 级联查询接口 ====================

    /**
     * 获取所有挖掘机机型列表
     *
     * @return 机型列表
     */
    List<String> getExcavatorModelList();

    /**
     * 根据机型获取故障部分列表
     *
     * @param excavatorModel 机型
     * @return 故障部分列表
     */
    List<String> getFaultPartList(String excavatorModel);

    /**
     * 根据机型和故障部分获取故障现象列表
     *
     * @param excavatorModel 机型
     * @param faultPart     故障部分
     * @return 故障现象列表
     */
    List<String> getFaultSymptomList(String excavatorModel, String faultPart);

    /**
     * 根据机型、故障部分、故障现象获取故障详情列表（第四级查询）
     *
     * @param excavatorModel 机型
     * @param faultPart     故障部分
     * @param faultSymptom  故障现象
     * @return 故障详情列表
     */
    List<Map<String, Object>> getFaultDetailList(String excavatorModel, String faultPart, String faultSymptom);

    // ==================== 基础CRUD接口 ====================

    /**
     * 新增故障信息（基础版本）
     *
     * @param bo 故障信息
     * @return 结果
     */
    Boolean insertByBo(SysFaultInfoBo bo);

    /**
     * 修改故障信息（基础版本）
     *
     * @param bo 故障信息
     * @return 结果
     */
    Boolean updateByBo(SysFaultInfoBo bo);

    /**
     * 校验并批量删除故障信息（基础版本）
     *
     * @param ids     需要删除的故障信息主键集合
     * @param isValid 是否校验,true-删除前校验,false-不校验
     * @return 结果
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    // ==================== 一体化管理接口（推荐使用） ====================

    /**
     * 一体化创建：新增故障信息和解决方案
     * 
     * @param manageBo 故障管理复合BO
     * @param files    解决方案文件（可选）
     * @return 完整的故障信息（包含解决方案）
     */
    SysFaultInfoVo createFaultWithSolution(SysFaultManageBo manageBo, MultipartFile[] files);

    /**
     * 一体化更新：修改故障信息和解决方案
     * 
     * @param manageBo 故障管理复合BO
     * @param files    解决方案文件（可选）
     * @return 完整的故障信息（包含解决方案）
     */
    SysFaultInfoVo updateFaultWithSolution(SysFaultManageBo manageBo, MultipartFile[] files);

    /**
     * 一体化删除：删除故障信息和相关解决方案
     * 
     * @param ids               故障ID集合
     * @param cascadeStrategy   级联删除策略
     *                         - auto: 自动判断（仅当解决方案仅被当前故障引用时删除）
     *                         - yes: 强制删除解决方案
     *                         - no: 不删除解决方案
     * @return 删除结果
     */
    Boolean deleteFaultWithCascade(Collection<Long> ids, String cascadeStrategy);

    // ==================== 兼容性接口（已废弃，保留兼容） ====================

    /**
     * @deprecated 使用 createFaultWithSolution 替代
     */
    @Deprecated
    SysFaultInfoVo createWithSolution(SysFaultInfoBo faultBo,
                                      MultipartFile[] files,
                                      String folderName,
                                      String remark,
                                      String action,
                                      Long linkDocId);

    /**
     * @deprecated 使用 updateFaultWithSolution 替代
     */
    @Deprecated
    SysFaultInfoVo updateWithSolution(SysFaultInfoBo faultBo,
                                      MultipartFile[] files,
                                      String folderName,
                                      String remark,
                                      String action,
                                      Long linkDocId,
                                      Boolean deleteOld);

    /**
     * @deprecated 使用 deleteFaultWithCascade 替代
     */
    @Deprecated
    Boolean deleteWithCascade(Collection<Long> ids, String cascadeStrategy);
}
